/**
 * 企业微信API封装
 * 包含JS-SDK初始化、分享功能等
 */
// import qyWx from 'weixin-js-sdk' // 引入SDK
import request from "@/utils/request.js";
import api from "@/utils/api";

// 企业微信JS-SDK对象
// let qyWx = null;

// 初始化状态
let isInitialized = false;

/**
 * 初始化企业微信JS-SDK
 * @param {Object} config - 配置参数
 * @param {string} config.corpid - 企业ID
 * @param {string} config.agentid - 应用ID
 * @param {string} config.timestamp - 时间戳
 * @param {string} config.nonceStr - 随机字符串
 * @param {string} config.signature - 签名
 * @returns {Promise<boolean>} - 初始化结果
 */
export function initWeComSDK(config) {
	return new Promise((resolve, reject) => {
		try {
			// 检查是否在企业微信环境
			if (!isWeComEnv()) {
				reject(new Error('请在企业微信客户端中打开'));
				return;
			}

			// 检查是否已加载JS-SDK
			if (!window.wx) {
				// 动态加载JS-SDK
				const script = document.createElement('script');
				script.src = 'https://res.wx.qq.com/open/js/jweixin-1.6.0.js';
				document.head.appendChild(script);

				script.onload = () => {
					qyWx = window.wx;
					initConfig(config, resolve, reject);
				};

				script.onerror = () => {
					reject(new Error('加载企业微信JS-SDK失败'));
				};
			} else {
				qyWx = window.wx;
				initConfig(config, resolve, reject);
			}
		} catch (error) {
			console.error('初始化企业微信SDK失败:', error);
			reject(error);
		}
	});
}

/**
 * 初始化配置
 */
function initConfig(config, resolve, reject) {
	try {
		qyWx.config({
			beta: true, // 必须这么写，否则wx.invoke调用形式的jsapi会有问题
			debug: false, // 开启调试模式
			appId: config.corpid, // 必填，企业微信的corpID
			timestamp: config.timestamp, // 必填，生成签名的时间戳
			nonceStr: config.nonceStr, // 必填，生成签名的随机串
			signature: config.signature, // 必填，签名
			jsApiList: [
				'checkJsApi',
				'chooseImage',
				'getLocalImgData',
				'uploadImage',
				'shareToExternalContact',
				'shareToExternalChat',
				'shareToExternalMoments',
				'sendChatMessage'
			] // 必填，需要使用的JS接口列表
		});

		qyWx.ready(() => {
			console.log('企业微信JS-SDK初始化成功');
			isInitialized = true;

			// 调用agentConfig
			if (config.agentid) {
				qyWx.agentConfig({
					corpid: config.corpid, // 必填，企业微信的corpid，必须与当前登录的企业一致
					agentid: config.agentid, // 必填，企业微信的应用id
					timestamp: config.timestamp, // 必填，生成签名的时间戳
					nonceStr: config.nonceStr, // 必填，生成签名的随机串
					signature: config.signature, // 必填，签名
					jsApiList: [
						'shareToExternalContact',
						'shareToExternalChat',
						'shareToExternalMoments',
						'sendChatMessage'
					], // 必填，需要使用的接口名称
					success: function() {
						console.log('企业微信agentConfig初始化成功');
						resolve(true);
					},
					fail: function(res) {
						console.error('企业微信agentConfig初始化失败:', res);
						if (res.errMsg.indexOf('function not exist') > -1) {
							console.error('版本过低请升级企业微信');
						}
						resolve(false);
					}
				});
			} else {
				resolve(true);
			}
		});

		qyWx.error((res) => {
			console.error('企业微信JS-SDK初始化失败:', res);
			reject(new Error(`初始化失败: ${res.errMsg}`));
		});
	} catch (error) {
		console.error('企业微信SDK配置失败:', error);
		reject(error);
	}
}

/**
 * 检查是否在企业微信环境
 * @returns {boolean} - 是否在企业微信环境
 */
export function isWeComEnv() {
	const ua = window.navigator.userAgent.toLowerCase();
	return ua.indexOf('wxwork') > -1;
}

/**
 * 检查是否支持指定的JSAPI
 * @param {Array<string>} apiList - API列表
 * @returns {Promise<boolean>} - 是否支持
 */
export function checkJsApi(apiList) {
	return new Promise((resolve) => {
		if (!isInitialized || !qyWx) {
			resolve(false);
			return;
		}

		qyWx.checkJsApi({
			jsApiList: apiList,
			success: (res) => {
				// 检查每一个API是否都支持
				const allSupported = apiList.every(api => res.checkResult[api]);
				resolve(allSupported);
			},
			fail: () => {
				resolve(false);
			}
		});
	});
}

/**
 * 上传图片到企业微信服务器
 * @param {string} localId - 本地图片ID
 * @returns {Promise<string>} - 服务器图片ID
 */
export function uploadImage(localId) {
	return new Promise((resolve, reject) => {
		if (!isInitialized || !qyWx) {
			reject(new Error('企业微信SDK未初始化'));
			return;
		}

		qyWx.uploadImage({
			localId: localId,
			isShowProgressTips: 1,
			success: (res) => {
				if (res.serverId) {
					resolve(res.serverId);
				} else {
					reject(new Error('上传图片失败，未返回serverId'));
				}
			},
			fail: (res) => {
				reject(new Error(`上传图片失败: ${res.errMsg}`));
			}
		});
	});
}

/**
 * 分享图片给企业微信联系人
 * @param {Object} options - 分享选项
 * @param {string} options.imageUrl - 图片URL
 * @param {string} options.title - 标题
 * @param {string} options.desc - 描述
 * @returns {Promise<boolean>} - 分享结果
 */
export function shareToContact(options) {
	return new Promise((resolve, reject) => {
		if (!isInitialized || !qyWx) {
			reject(new Error('企业微信SDK未初始化'));
			return;
		}

		// 检查是否支持分享接口
		checkJsApi(['shareToExternalContact']).then((supported) => {
			if (!supported) {
				reject(new Error('当前版本不支持分享到联系人功能'));
				return;
			}

			// 构造分享参数
			const shareParams = {
				msgtype: 'image',
				image: {
					imgUrl: options.imageUrl
				},
				text: {
					content: options.title || '分享图片'
				}
			};

			// 调用分享接口
			qyWx.invoke('shareToExternalContact', shareParams, (res) => {
				if (res.err_msg === 'shareToExternalContact:ok') {
					resolve(true);
				} else {
					reject(new Error(`分享失败: ${res.err_msg}`));
				}
			});
		}).catch((error) => {
			reject(error);
		});
	});
}

/**
 * 分享图片到朋友圈
 * @param {Object} options - 分享选项
 * @param {string} options.imageUrl - 图片URL
 * @param {string} options.content - 分享内容
 * @returns {Promise<boolean>} - 分享结果
 */
export function shareToMoments(options) {
	return new Promise((resolve, reject) => {
		if (!isInitialized || !qyWx) {
			reject(new Error('企业微信SDK未初始化'));
			return;
		}

		// 检查是否支持分享接口
		checkJsApi(['shareToExternalMoments']).then((supported) => {
			if (!supported) {
				// 降级处理：保存图片到相册，提示用户手动分享
				saveImageToAlbum(options.imageUrl).then(() => {
					uni.showModal({
						title: '分享提示',
						content: '图片已保存到相册，请手动分享到朋友圈',
						showCancel: false,
						success: () => {
							resolve(true);
						}
					});
				}).catch((error) => {
					reject(error);
				});
				return;
			}

			// 构造分享参数
			const shareParams = {
				text: {
					content: options.content || '分享内容'
				},
				attachments: {
					msgtype: 'image',
					image: {
						imgUrl: options.imageUrl
					}
				}
			};

			// 调用分享接口
			qyWx.invoke('shareToExternalMoments', shareParams, (res) => {
				if (res.err_msg === 'shareToExternalMoments:ok') {
					resolve(true);
				} else {
					reject(new Error(`分享失败: ${res.err_msg}`));
				}
			});
		}).catch((error) => {
			reject(error);
		});
	});
}

/**
 * 保存图片到相册
 * @param {string} imageUrl - 图片URL
 * @returns {Promise<boolean>} - 保存结果
 */
export function saveImageToAlbum(imageUrl) {
	return new Promise((resolve, reject) => {
		// H5环境下的处理
		if (typeof window !== 'undefined' && window.document) {
			// 创建一个隐藏的a标签
			const link = document.createElement('a');
			link.style.display = 'none';

			// 处理Base64图片
			if (imageUrl.startsWith('data:image')) {
				link.href = imageUrl;
				link.download = 'share_image.png';
				document.body.appendChild(link);
				link.click();
				document.body.removeChild(link);
				resolve(true);
			} else {
				// 处理网络图片
				const img = new Image();
				img.crossOrigin = 'Anonymous'; // 解决跨域问题
				img.onload = function() {
					// 创建Canvas
					const canvas = document.createElement('canvas');
					canvas.width = img.width;
					canvas.height = img.height;

					// 绘制图片
					const ctx = canvas.getContext('2d');
					ctx.drawImage(img, 0, 0);

					// 获取图片URL
					const dataURL = canvas.toDataURL('image/png');

					// 创建下载链接
					link.href = dataURL;
					link.download = 'share_image.png';
					document.body.appendChild(link);
					link.click();
					document.body.removeChild(link);

					resolve(true);
				};
				img.onerror = function() {
					reject(new Error('下载图片失败'));
				};
				img.src = imageUrl;
			}
			return;
		}

		// 小程序环境下的处理
		if (typeof uni !== 'undefined') {
			// 检查是否是Base64图片
			if (imageUrl.startsWith('data:image')) {
				// 处理Base64图片
				const base64Data = imageUrl.replace(/^data:image\/\w+;base64,/, '');

				// 将Base64转换为临时文件
				uni.base64ToArrayBuffer(base64Data, (res) => {
					const tempFilePath = `${wx.env.USER_DATA_PATH}/share_image.png`;

					uni.writeFile({
						filePath: tempFilePath,
						data: res.data,
						encoding: 'binary',
						success: () => {
							// 保存到相册
							uni.saveImageToPhotosAlbum({
								filePath: tempFilePath,
								success: () => {
									resolve(true);
								},
								fail: (err) => {
									reject(new Error(
										`保存图片到相册失败: ${err.errMsg}`));
								}
							});
						},
						fail: (err) => {
							reject(new Error(`写入文件失败: ${err.errMsg}`));
						}
					});
				});
			} else {
				// 处理网络图片
				uni.downloadFile({
					url: imageUrl,
					success: (res) => {
						if (res.statusCode === 200) {
							// 保存到相册
							uni.saveImageToPhotosAlbum({
								filePath: res.tempFilePath,
								success: () => {
									resolve(true);
								},
								fail: (err) => {
									reject(new Error(`保存图片到相册失败: ${err.errMsg}`));
								}
							});
						} else {
							reject(new Error(`下载图片失败: ${res.statusCode}`));
						}
					},
					fail: (err) => {
						reject(new Error(`下载图片失败: ${err.errMsg}`));
					}
				});
			}
		} else {
			reject(new Error('不支持的环境'));
		}
	});
}

/**
 * 获取企业微信配置签名
 * @param {string} url - 当前页面URL
 * @returns {Promise<Object>} - 配置参数
 */
export function getWeComConfig(url) {
	// 实际项目中应该从后端获取配置
	// 这里使用模拟数据
	return new Promise((resolve) => {
		// 模拟API请求延迟
		setTimeout(() => {
			resolve({
				corpid: 'wx1234567890abcdef', // 企业ID，实际应该从后端获取
				agentid: '1000001', // 应用ID，实际应该从后端获取
				timestamp: Math.floor(Date.now() / 1000), // 时间戳
				nonceStr: Math.random().toString(36).substr(2, 15), // 随机字符串
				signature: 'mock_signature' // 签名，实际应该从后端获取
			});
		}, 500);
	});
}

/**
 * 企业微信初始化
 * @param {Array} jsApiList 需要使用的JS接口列表
 */
export function initWxWork(jsApiList = []) {
	return new Promise((resolve, reject) => {
		try {
			// 检查是否在企业微信环境
			if (!isWeComEnv()) {
				reject(new Error('请在企业微信客户端中打开'));
				return;
			}

			// 1. 获取当前页面URL（用于签名，需去除#及后面部分）
			const currentUrl = getCurrentPageUrl();
			console.log('当前页面URL:', currentUrl);

			// 2. 调用后端接口获取签名参数
			request(api.getJsticket + `?url=${encodeURIComponent(currentUrl)}`, "GET")
				.then(res => {
					console.log('获取签名参数结果:', res);

					if (res.code !== 0 || !res.data) {
						reject(new Error('获取签名参数失败: ' + (res.msg || '未知错误')));
						return;
					}

					const {
						timestamp,
						nonceStr,
						signature
					} = res.data

					// 3. 初始化企业微信JS-SDK
					wx.config({
						beta: true, // 必须这么写，否则wx.invoke调用形式的jsapi会有问题
						appId: 'ww36f98ef0549bac0e', // 企业微信的corpID
						timestamp: timestamp, // 时间戳
						nonceStr: nonceStr, // 随机字符串
						signature: signature, // 签名
						jsApiList: [...jsApiList, 'openEnterpriseChat'] // 必须包含打开聊天的接口
					})
					// 4. 处理初始化结果
					wx.ready(() => {
						console.log('企业微信初始化成功')
						resolve(wx)
					})

					wx.error(err => {
						console.error('企业微信初始化失败：', err)
						reject(err)
					})
				})
				.catch(err => {
					console.error('获取签名失败：', err);
					reject(err);
				})
		} catch (err) {
			console.error('企业微信初始化异常：', err);
			reject(err);
		}
	});
}

/**
 * 初始化微信配置
 */
function initWxConfig(url, timestamp, nonceStr, signature, jsApiList, resolve, reject) {
	try {
		// 合并API列表，确保包含基础API
		const mergedApiList = [
			...new Set([
				...jsApiList,
				'checkJsApi',
				'openEnterpriseChat',
				'getCurUserInfo'
			])
		];

		qyWx.config({
			beta: true, // 必须这么写，否则wx.invoke调用形式的jsapi会有问题
			debug: false, // 开启调试模式
			appId: 'ww36f98ef0549bac0e', // 企业微信的corpID
			timestamp: timestamp, // 时间戳
			nonceStr: nonceStr, // 随机字符串
			signature: signature, // 签名
			jsApiList: mergedApiList // 需要使用的JS接口列表
		});

		// 4. 处理初始化结果
		qyWx.ready(() => {
			console.log('企业微信初始化成功');
			isInitialized = true;
			resolve(qyWx);
		});

		qyWx.error(err => {
			console.error('企业微信初始化失败：', err);
			isInitialized = false;
			reject(new Error(`初始化失败: ${err.errMsg}`));
		});
	} catch (error) {
		console.error('企业微信配置失败:', error);
		reject(error);
	}
}

/**
 * 示例：调用企业微信接口（如获取当前用户信息）
 */
export function getWxUserInfo() {
	return new Promise((resolve, reject) => {
		if (!isInitialized || !qyWx) {
			reject(new Error('企业微信SDK未初始化'));
			return;
		}

		qyWx.invoke('getCurUserInfo', {}, (res) => {
			if (res.err_msg === 'getCurUserInfo:ok') {
				resolve(res.userInfo) // 返回用户信息（包括userId、name等）
			} else {
				reject(new Error('获取用户信息失败：' + res.err_msg))
			}
		})
	})
}

/**
 * 打开企业微信聊天窗口
 * @param {Object} options 聊天参数
 * @param {String} options.userIds 企业内部用户ID（多个用逗号分隔，单聊传一个）
 * @param {String} options.externalUserIds 外部联系人ID（可选）
 * @param {String} options.groupName 群聊名称（多用户时生效）
 */
export function openChat(options) {
	return new Promise((resolve, reject) => {
		if (!isInitialized || !qyWx) {
			reject(new Error('企业微信SDK未初始化'));
			return;
		}

		// 检查是否支持打开聊天接口
		checkJsApi(['openEnterpriseChat']).then((supported) => {
			if (!supported) {
				reject(new Error('当前版本不支持打开聊天功能'));
				return;
			}

			qyWx.invoke('openEnterpriseChat', options, (res) => {
				if (res.err_msg === 'openEnterpriseChat:ok') {
					console.log('打开聊天成功')
					resolve(res)
				} else {
					console.error('打开聊天失败：', res.err_msg)
					reject(new Error(`打开聊天失败：${res.err_msg}`))
				}
			})
		}).catch((error) => {
			reject(error);
		});
	})
}

/**
 * 获取当前页面URL
 */
function getCurrentPageUrl() {
	// H5环境下直接使用window.location.href
	if (typeof window !== 'undefined' && window.location) {
		return window.location.href.split('#')[0];
	}

	// 在UniApp中获取当前页面URL
	try {
		const pages = getCurrentPages();
		const currentPage = pages[pages.length - 1];
		const route = currentPage.route;
		const options = currentPage.options;

		// 构建完整URL
		let url = `https://jinzhizixun.com.cn/${route}`;
		const params = [];

		for (let key in options) {
			params.push(`${key}=${encodeURIComponent(options[key])}`);
		}

		if (params.length > 0) {
			url += '?' + params.join('&');
		}

		return url.split('#')[0]; // 去除#后面的部分
	} catch (error) {
		console.warn('获取当前页面URL失败:', error);
		return '';
	}
}